home *** CD-ROM | disk | FTP | other *** search
- (******************************************************************************)
-
- program tabedit;
-
- (******************************************************************************)
-
- uses macintf;
-
- {$L rsrc.rel }
- {$T APPL BRAD }
- {$B+ }
-
- {$U tabglue }
-
- (******************************************************************************)
-
- const
-
- applemenu = 301;
- filemenu = 302;
- editmenu = 303;
- windid = 300;
- aboutid = 300;
-
- (******************************************************************************)
-
- type
-
- tabrecord = record
- tabte : tehandle;
- tabwidth : integer;
- lasttab : integer;
- tabs : array [1..100] of integer;
- end;
- tabptr = ^tabrecord;
- tabhandle = ^tabptr;
-
- longptr = ^long;
-
- (******************************************************************************)
-
- var
-
- done : logical;
- mywindow : windowptr;
- nowte : tehandle;
- nowtabs : tabhandle;
- textcursor : curshandle;
- dragarea : rect;
- stdtedotext : long;
- stdlinestart : long;
- globala70 : longptr;
- global7fc : longptr;
- myqdprocs : qdprocs;
-
- (******************************************************************************)
-
- function tabtxmeas(bytecount : integer; textaddr : ptr;
- var numer, denom : point; var info : fontinfo) : integer; external;
- procedure tabtxwrite(bytecount : integer; textbuf : ptr;
- numer, denom : point); external;
- procedure tabtedotext; external;
- procedure tablinestart; external;
-
- (******************************************************************************)
-
- procedure setupfortabs(resid : integer; wptr : windowptr);
-
- var
- ahndl : handle;
- reshndl : handle;
- tabh : tabhandle;
- i : integer;
- widthzerochar : integer;
- btabsize : long;
-
- begin
-
- ahndl := handle(getwrefcon(wptr));
- reshndl := getresource('bTAB', resid);
- btabsize := gethandlesize(reshndl);
-
- sethandlesize(ahndl, btabsize + 6);
- tabh := tabhandle(ahndl);
-
- tabh^^.tabwidth := charwidth(chr(9));
-
- blockmove(reshndl^, @tabh^^.lasttab, btabsize);
- releaseresource(reshndl);
-
- widthzerochar := charwidth(chr(48));
- with tabh^^ do
- if lasttab <> 0 then
- for i := 1 to lasttab do
- tabs[i] := tabs[i] * widthzerochar;
-
- wptr^.grafprocs := @myqdprocs;
-
- end;
-
- (******************************************************************************)
-
- procedure setupmenus;
-
- var
- menutopic : menuhandle;
-
- begin
-
- menutopic := getmenu(applemenu);
- addresmenu(menutopic, 'DRVR');
- insertmenu(menutopic, 0);
-
- menutopic := getmenu(filemenu);
- insertmenu(menutopic, 0);
-
- menutopic := getmenu(editmenu);
- insertmenu(menutopic, 0);
-
- drawmenubar;
-
- end;
-
- (******************************************************************************)
-
- function setuptextwindow(idno : integer) : windowptr;
-
- var
- hndl : handle;
- r : rect;
- li : longptr;
- myw : windowptr;
- ate : tehandle;
-
- begin
-
- myw := getnewwindow(idno, nil, pointer(-1));
- setport(myw);
-
- r := myw^.portrect;
- with r do begin
- top := top + 4;
- left := left + 4;
- end;
- ate := tenew(r, r);
-
- hndl := newhandle(4);
- li := longptr(hndl^);
- li^ := long(ate);
- setwrefcon(myw, long(hndl));
-
- setupfortabs(idno, myw);
-
- setuptextwindow := myw;
-
- end;
-
- (******************************************************************************)
-
- procedure initialize;
-
- var
- i : integer;
- r : rect;
-
- begin
-
- initgraf(@theport);
- initfonts;
- initwindows;
- initmenus;
- teinit;
- initdialogs(nil);
- flushevents(everyevent, 0);
-
- r := screenbits.bounds;
- setrect(dragarea, r.left + 4, r.top + 24, r.right - 4, r.bottom - 4);
- done := false;
- setupmenus;
-
- mywindow := setuptextwindow(windid);
- nowtabs := tabhandle(getwrefcon(mywindow));
- nowte := nowtabs^^.tabte;
-
- textcursor := getcursor(ibeamcursor);
- hlock(handle(textcursor));
- initcursor;
-
- globala70 := longptr($a70);
- stdtedotext := globala70^;
- globala70^ := long(@tabtedotext);
-
- global7fc := longptr($7fc);
- stdlinestart := global7fc^;
- global7fc^ := long(@tablinestart);
-
- setstdprocs(myqdprocs);
- myqdprocs.txmeasproc := @tabtxmeas;
- myqdprocs.textproc := @tabtxwrite;
-
- end;
-
- (******************************************************************************)
-
- procedure processmenu(codeword : long);
-
- var
- i : integer;
- menuno : integer;
- itemno : integer;
- nameholder : str255;
- dna : integer;
- ourdlg : dialogptr;
-
- begin
-
- if codeword <> 0 then begin
-
- menuno := hiword(codeword);
- itemno := loword(codeword);
-
- case menuno of
-
- applemenu : begin
-
- if itemno = 1 then begin
- ourdlg := getnewdialog(aboutid, nil, pointer(-1));
- modaldialog(nil, i);
- disposdialog(ourdlg);
- end else begin
- getitem(getmhandle(applemenu), itemno, nameholder);
- dna := opendeskacc(nameholder);
- end;
-
- end;
-
- filemenu : begin
-
- case itemno of
- 1 : begin
- mywindow := setuptextwindow(windid);
- nowtabs := tabhandle(getwrefcon(mywindow));
- nowte := nowtabs^^.tabte;
- disableitem(getmhandle(filemenu), 1);
- end;
- 2 : done := true;
- end;
-
- end;
-
- editmenu : begin
-
- if not systemedit(itemno - 1) then case itemno of
- 3 : tecut(nowte);
- 4 : tecopy(nowte);
- 5 : tepaste(nowte);
- 6 : tedelete(nowte);
- end;
-
- end;
-
- end;
-
- end;
-
- hilitemenu(0);
-
- end;
-
- (******************************************************************************)
-
- procedure mousedowns(event : eventrecord);
-
- var
- pointedto : windowptr;
- mouseloc : point;
- windowloc : integer;
-
- begin
-
- mouseloc := event.where;
- windowloc := findwindow(mouseloc, pointedto);
-
- case windowloc of
-
- inmenubar : processmenu(menuselect(mouseloc));
- insyswindow : systemclick(event, pointedto);
-
- otherwise
- if pointedto <> frontwindow then
- selectwindow(pointedto)
- else case windowloc of
-
- incontent : begin
- globaltolocal(mouseloc);
- if bitand(event.modifiers, shiftkey) = shiftkey then
- teclick(mouseloc, true, nowte)
- else
- teclick(mouseloc, false, nowte);
- end;
-
- indrag : dragwindow(pointedto, mouseloc, dragarea);
-
- ingoaway : if trackgoaway(pointedto, mouseloc) then begin
- tedispose(nowte);
- disposhandle(handle(nowtabs));
- nowtabs := nil;
- disposewindow(pointedto);
- enableitem(getmhandle(filemenu), 1);
- end;
-
- end;
-
- end;
-
- end;
-
- (******************************************************************************)
-
- procedure keydowns(event : eventrecord);
-
- var
- charcode : char;
-
- begin
-
- charcode := chr(bitand(event.message, charcodemask));
-
- if bitand(event.modifiers, cmdkey) = cmdkey then
- processmenu(menukey(charcode))
- else
- tekey(charcode, nowte);
-
- end;
-
- (******************************************************************************)
-
- procedure activates(event : eventrecord);
-
- var
- targetwindow : windowptr;
- active : logical;
- ahndl : handle;
-
- begin
-
- targetwindow := windowptr(event.message);
- active := odd(event.modifiers);
-
- if active then begin
- setport(targetwindow);
- nowtabs := tabhandle(getwrefcon(targetwindow));
- nowte := nowtabs^^.tabte;
- teactivate(nowte);
- end else begin
- tedeactivate(nowte);
- nowtabs := nil;
- end;
-
- end;
-
- (******************************************************************************)
-
- procedure updates(event : eventrecord);
-
- var
- updatewindow : windowptr;
- saveport : windowptr;
- temptabs : tabhandle;
-
- begin
-
- updatewindow := windowptr(event.message);
- getport(saveport);
- temptabs := nowtabs;
- setport(updatewindow);
- nowtabs := tabhandle(getwrefcon(updatewindow));
-
- beginupdate(updatewindow);
- eraserect(updatewindow^.visrgn^^.rgnbbox);
- with nowtabs^^ do
- teupdate(tabte^^.viewrect, tabte);
- endupdate(updatewindow);
-
- setport(saveport);
- nowtabs := temptabs;
-
- end;
-
- (******************************************************************************)
-
- procedure maineventloop;
-
- var
- event : eventrecord;
- mousept : point;
-
- begin
-
- repeat
-
- systemtask;
-
- if mywindow = frontwindow then begin
- getmouse(mousept);
- if ptinrect(mousept, nowte^^.viewrect) then
- setcursor(textcursor^^)
- else
- setcursor(arrow);
- teidle(nowte);
- end;
-
- if getnextevent(everyevent, event) then
- case event.what of
- mousedown : mousedowns(event);
- keydown : keydowns(event);
- autokey : keydowns(event);
- activateevt : activates(event);
- updateevt : updates(event);
- end;
-
- until done;
-
- end;
-
- (******************************************************************************)
-
- begin
-
- initialize;
- maineventloop;
- globala70^ := stdtedotext;
- global7fc^ := stdlinestart;
-
- end.
-
- (******************************************************************************)
-